home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Atari Compendium
/
The Atari Compendium (Toad Computers) (1994).iso
/
files
/
umich
/
network
/
ka9q
/
nhclb120.zoo
/
ax25cmd.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-06-18
|
14KB
|
709 lines
#include <stdio.h>
#include "global.h"
#include "config.h"
#include "mbuf.h"
#include "ax25.h"
#include "ax_mbx.h"
#include "timer.h"
#include "netuser.h"
#include "ftp.h"
#include "tcp.h"
#include "telnet.h"
#include "iface.h"
#include "lapb.h"
#include "finger.h"
#include "cmdparse.h"
#include "session.h"
#include "nr4.h"
#ifdef UNIX
#include <string.h>
#include <sys/types.h>
time_t time();
#endif
/* heard stuff */
#include "heard.h"
/* heard stuff */
static dumpstat();
char *ax25states[] = {
"Disconnected",
"Conn pending",
"Disc pending",
"Connected",
"Recovery",
"Frame Reject",
};
int domycall(),dodigipeat(),doaxstat(),dot1(),dot2(),dot3(),domaxframe(),
doaxwindow(),dopaclen(),don2(),doaxreset(),dopthresh(),doheard();
#ifdef SID2
int dobbscall();
extern struct ax25_addr bbscall;
#endif
static struct cmds axcmds[] = {
"digipeat", dodigipeat, 0, NULLCHAR, NULLCHAR,
"maxframe", domaxframe, 0, NULLCHAR, NULLCHAR,
"mycall", domycall, 0, NULLCHAR, NULLCHAR,
#ifdef SID2
"bbscall", dobbscall, 0, NULLCHAR, NULLCHAR,
#endif
"paclen", dopaclen, 0, NULLCHAR, NULLCHAR,
"pthresh", dopthresh, 0, NULLCHAR, NULLCHAR,
"reset", doaxreset, 2, "ax25 reset <axcb>", NULLCHAR,
"retry", don2, 0, NULLCHAR, NULLCHAR,
"status", doaxstat, 0, NULLCHAR, NULLCHAR,
"t1", dot1, 0, NULLCHAR, NULLCHAR,
"t2", dot2, 0, NULLCHAR, NULLCHAR,
"t3", dot3, 0, NULLCHAR, NULLCHAR,
"window", doaxwindow, 0, NULLCHAR, NULLCHAR,
/* heard stuff */
"heard", doheard, 0, NULLCHAR, NULLCHAR,
/* heard stuff */
#ifdef SID2
NULLCHAR, NULLFP, 0, "ax25 subcommands: bbscall digipeat heard maxframe mycall paclen pthresh reset\n\t\tretry status t1 t2 t3 window", NULLCHAR,
#else
NULLCHAR, NULLFP, 0, "ax25 subcommands: digipeat heard maxframe mycall paclen pthresh reset retry\n\t\tstatus t1 t2 t3 window", NULLCHAR,
#endif
};
/* Multiplexer for top-level ax25 command */
doax25(argc,argv)
int argc;
char *argv[];
{
return subcmd(axcmds,argc,argv);
}
/*ARGSUSED*/
static
doaxreset(argc,argv)
int argc;
char *argv[];
{
struct ax25_cb *axp;
extern char notval[];
axp = (struct ax25_cb *)htol(argv[1]);
if(!ax25val(axp)){
printf(notval);
return 1;
}
reset_ax25(axp);
return 0;
}
/* Display AX.25 link level control blocks */
static
doaxstat(argc,argv)
int argc;
char *argv[];
{
register int i;
register struct ax25_cb *axp;
char tmp[10];
extern char notval[];
if(argc < 2){
printf(" &AXB IF Snd-Q Rcv-Q Remote State\n");
for(i=0;i<NHASH;i++){
for(axp = ax25_cb[i];axp != NULLAX25; axp = axp->next){
pax25(tmp,&axp->addr.dest);
printf("%8lx %-5s%-8d%-8d%-10s%s\n",
(long)axp,axp->interface->name,
len_q(axp->txq),len_mbuf(axp->rxq),
tmp,ax25states[axp->state]);
}
}
return 0;
}
axp = (struct ax25_cb *)htol(argv[1]);
if(!ax25val(axp)){
printf(notval);
return 1;
}
dumpstat(axp);
return 0;
}
/* Dump one control block */
static
dumpstat(axp)
register struct ax25_cb *axp;
{
char tmp[10];
int i;
if(axp == NULLAX25 || axp->interface == NULLIF)
return;
printf("&AXB IF Remote RB V(S) V(R) Unack P Retry State\n");
pax25(tmp,&axp->addr.dest);
printf("%4x %-5s%-9s",(int)axp,axp->interface->name,tmp);
putchar(axp->rejsent ? 'R' : ' ');
putchar(axp->remotebusy ? 'B' : ' ');
printf(" %4d %4d",axp->vs,axp->vr);
printf(" %02u/%02u %u",axp->unack,axp->maxframe,axp->proto);
printf(" %02u/%02u",axp->retries,axp->n2);
printf(" %s\n",ax25states[axp->state]);
printf("T1: ");
if(run_timer(&axp->t1))
printf("%lu",(axp->t1.start - axp->t1.count) * MSPTICK);
else
printf("stop");
printf("/%lu ms; ",axp->t1.start * MSPTICK);
printf("T2: ");
if(run_timer(&axp->t2))
printf("%lu",(axp->t2.start - axp->t2.count) * MSPTICK);
else
printf("stop");
printf("/%lu ms; ",axp->t2.start * MSPTICK);
printf("T3: ");
if(run_timer(&axp->t3))
printf("%lu",(axp->t3.start - axp->t3.count) * MSPTICK);
else
printf("stop");
printf("/%lu ms\n",axp->t3.start * MSPTICK);
if(axp->addr.ndigis == 0)
return;
printf("Digipeaters:");
for(i=0;i<axp->addr.ndigis;i++){
pax25(tmp,&axp->addr.digis[i]);
printf(" %s",tmp);
}
printf("\n");
}
/* Display or change our AX.25 address */
static
domycall(argc,argv)
int argc;
char *argv[];
{
char buf[15];
if(argc < 2){
pax25(buf,&mycall);
printf("%s\n",buf);
return 0;
}
if(setcall(&mycall,argv[1]) == -1)
return -1;
mycall.ssid |= E;
return 0;
}
#ifdef SID2
/* Display or change our AX.25 BBS address */
static
dobbscall(argc,argv)
int argc;
char *argv[];
{
char buf[15];
if(argc < 2){
pax25(buf,&bbscall);
printf("%s\n",buf);
return 0;
}
if(setcall(&bbscall,argv[1]) == -1)
return -1;
bbscall.ssid |= E;
return 0;
}
#endif
/* Control AX.25 digipeating */
static
dodigipeat(argc,argv)
int argc;
char *argv[];
{
extern int digipeat;
if(argc == 1) {
printf("digipeat %s\n",digipeat ? "on" : "off");
} else {
if(strcmp(argv[1],"on") == 0)
digipeat = 1;
else
digipeat = 0;
}
}
/* Set retransmission timer */
static
dot1(argc,argv)
int argc;
char *argv[];
{
extern int16 t1init;
long atol();
if(argc == 1) {
printf("T1 %lu ms\n",(long)t1init * MSPTICK);
} else {
t1init = (int16)atol(argv[1]) / MSPTICK;
}
}
/* Set acknowledgement delay timer */
static
dot2(argc,argv)
int argc;
char *argv[];
{
extern int16 t2init;
long atol();
if(argc == 1) {
printf("T2 %lu ms\n",(long)t2init * MSPTICK);
} else {
t2init = (int16)atol(argv[1]) / MSPTICK;
}
}
/* Set idle timer */
static
dot3(argc,argv)
int argc;
char *argv[];
{
extern int16 t3init;
long atol();
if(argc == 1) {
printf("T3 %lu ms\n",(long)t3init * MSPTICK);
} else {
t3init = (int16)atol(argv[1]) / MSPTICK;
}
}
/* Set retry limit count */
static
don2(argc,argv)
int argc;
char *argv[];
{
extern int16 n2;
if(argc == 1) {
printf("Retry %u\n",n2);
} else {
n2 = atoi(argv[1]);
}
}
/* Set maximum number of frames that will be allowed in flight */
static
domaxframe(argc,argv)
int argc;
char *argv[];
{
extern int16 maxframe;
if(argc == 1) {
printf("Maxframe %u\n",maxframe);
} else {
maxframe = atoi(argv[1]);
}
}
/* Set maximum length of I-frame data field */
static
dopaclen(argc,argv)
int argc;
char *argv[];
{
extern int16 paclen;
if(argc == 1) {
printf("Paclen %u\n",paclen);
} else {
paclen = atoi(argv[1]);
}
}
/* Set size of I-frame above which polls will be sent after a timeout */
static
dopthresh(argc,argv)
int argc;
char *argv[];
{
extern int16 pthresh;
if(argc == 1) {
printf("Pthresh %u\n",pthresh);
} else {
pthresh = atoi(argv[1]);
}
}
/* Set high water mark on receive queue that triggers RNR */
static
doaxwindow(argc,argv)
int argc;
char *argv[];
{
extern int16 axwindow;
if(argc == 1) {
printf("Axwindow %u\n",axwindow);
} else {
axwindow = atoi(argv[1]);
}
}
/* End of ax25 subcommands */
/* Initiate interactive AX.25 connect to remote station */
doconnect(argc,argv)
int argc;
char *argv[];
{
void ax_rx(),ax_tx(),ax_state();
int ax_parse();
struct ax25_addr dest;
struct ax25 addr;
struct ax25_cb *open_ax25();
struct interface *ifp;
struct session *s;
extern int16 axwindow;
int i;
if (strcmp(argv[1],"netrom") == 0) {
printf("Connect on netrom interface not supported\n") ;
return 1 ;
}
for(ifp = ifaces; ifp != NULLIF; ifp = ifp->next)
if(strcmp(argv[1],ifp->name) == 0)
break;
if(ifp == NULLIF){
printf("Interface %s unknown\n",argv[1]);
return 1;
}
setcall(&dest,argv[2]);
/* See if a session already exists */
for(s = sessions; s < &sessions[nsessions]; s++){
if(s->type == AX25TNC
&& addreq(&s->cb.ax25_cb->addr.dest,&dest)){
#if (defined(MAC) || defined(AMIGA))
printf("Session %lu to %s already exists\n",
#else
printf("Session %u to %s already exists\n",
#endif
s - sessions,argv[2]);
return 1;
}
}
/* Allocate a session descriptor */
if((s = newsession()) == NULLSESSION){
printf("Too many sessions\n");
return 1;
}
if((s->name = malloc((unsigned)strlen(argv[2])+1)) != NULLCHAR)
strcpy(s->name,argv[2]);
s->type = AX25TNC;
s->parse = ax_parse;
current = s;
ASSIGN(addr.source,mycall);
setcall(&addr.dest,argv[2]);
for(i=3; i < argc; i++)
setcall(&addr.digis[